using System;

namespace AzureContrib.WindowsAzure.Diagnostics
{
	/// <summary>
	/// The trace contract
	/// </summary>
	public interface ITrace : ITraceSwitchable, ITraceControls
	{
		#region Old School

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.TraceInformation(string)"/>
		/// </summary>
		void TraceInformation(string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.TraceInformation(string,object[])"/>
		/// </summary>
		void TraceInformation(string format, params object[] args);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.TraceWarning(string)"/>
		/// </summary>
		void TraceWarning(string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.TraceWarning(string,object[])"/>
		/// </summary>
		void TraceWarning(string format, params object[] args);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.TraceError(string)"/>
		/// </summary>
		void TraceError(string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.TraceError(string,object[])"/>
		/// </summary>
		void TraceError(string format, params object[] args);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.Write(object)"/>
		/// </summary>
		void Write(object value);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.Write(string)"/>
		/// </summary>
		void Write(string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.Write(object,string)"/>
		/// </summary>
		void Write(object value, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace"/>
		/// </summary>
		void Write(string message, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteIf(bool,string)"/>
		/// </summary>
		void WriteIf(bool condition, string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteIf(bool,object,string)"/>
		/// </summary>
		void WriteIf(bool condition, object value, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteIf(bool,string,string)"/>
		/// </summary>
		void WriteIf(bool condition, string message, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLine(object)"/>
		/// </summary>
		void WriteLine(object value);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLine(string)"/>
		/// </summary>
		void WriteLine(string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLine(object,string)"/>
		/// </summary>
		void WriteLine(object value, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLine(string,string)"/>
		/// </summary>
		void WriteLine(string message, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLineIf(bool,object)"/>
		/// </summary>
		void WriteLineIf(bool condition, object value);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLineIf(bool,string)"/>
		/// </summary>
		void WriteLineIf(bool condition, string message);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLineIf(bool,object,string)"/>
		/// </summary>
		void WriteLineIf(bool condition, object value, string category);

		/// <summary>
		/// <see cref="System.Diagnostics.Trace.WriteLineIf(bool,string,string)"/>
		/// </summary>
		void WriteLineIf(bool condition, string message, string category);

		#endregion

		#region Verbose

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose(Func<string> message);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose(string message);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a message as Verbose. Only trace if <see cref="ITraceControls.VerboseEnabled"/>.
		/// </summary>
		void Verbose<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Verbose

		#region Information

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information(Func<string> message);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information(string message);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a message as Information. Only trace if <see cref="ITraceControls.InformationEnabled"/>.
		/// </summary>
		void Information<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Information

		#region Warning

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning(Func<string> message);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning(string message);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a message as Warning. Only trace if <see cref="ITraceControls.WarningEnabled"/>.
		/// </summary>
		void Warning<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Warning

		#region Error

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error(Func<string> message);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error(string message);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg>(string message, TArg arg);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg>(string message, TArg arg, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2>(string message, TArg1 arg1, TArg2 arg2, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3, TArg4>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, IFormatProvider provider);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6);

		/// <summary>
		/// Trace a message as Error. Only trace if <see cref="ITraceControls.ErrorEnabled"/>.
		/// </summary>
		void Error<TArg1, TArg2, TArg3, TArg4, TArg5, TArg6>(string message, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, IFormatProvider provider);

		#endregion Error
	}
}